package com.mmq.ets.main;
/******************************************************
Cours:  LOG121
Projet: Squelette du laboratoire #1
Nom du fichier: ApplicationFormes.java
Date créé: 2013-05-03
*******************************************************
Historique des modifications
*******************************************************
*@author Patrice Boucher
2013-05-03 Version initiale
*******************************************************/  
 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Comparator;

import com.mmq.ets.controleur.ControleurFrontal;
import com.mmq.ets.modele.Carre;
import com.mmq.ets.modele.CommBase;
import com.mmq.ets.modele.AbstractForme;
import com.mmq.ets.modele.GestionaireFormes;
import com.mmq.ets.modele.Rectangle;
import com.mmq.ets.util.Labo2Const;
import com.mmq.ets.util.ListeChainee;
import com.mmq.ets.visuel.FenetrePrincipale;

/**
 * Cette classe représente l'application dans son ensemble. 
 * @author Patrice Boucher
 * @date 2013/05/04
 */
public class ApplicationFormes{
	
	/**
	 * main de l'application
	 * @param args
	 * @throws SecurityException 
	 * @throws NoSuchMethodException 
	 * @throws InvocationTargetException 
	 * @throws IllegalArgumentException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException 
	{
		@SuppressWarnings("unused")
		ApplicationFormes application = new ApplicationFormes();
		/*
		ListeChainee<Forme> liste=new ListeChainee<Forme>();
		
        for(int i=0;i<5;i++)
        {
        	liste.ajouter(new Carre(1,0,0,20+i,20+i));
        }
        for(Forme f : liste)
        {
        	System.out.println(f.getLargeur());
        }*/
		
		/*
		FRED: Voici un simple exemple de ce que je t'ai expliqué au derniers cours.
		Pour y arriver, tu pourrais faire les etapes suivantes
		*Définir chaque comparator dans la classe forme et non aux classes filles suivant le criteres de tri.Tu as tous ce quil t faut dans la classe Forme
		*En suite copier leur noms(exactement les mêmes!) dans l'enum "NomsComparators", tu peux changer le nom hahaha. Je n'ai pas d'imagination 
		*Dans la classe TrieurForme on va avoir un seule method trier qui recoit (Forme liste, )
		*Finalement tu get la methode correspondant au critere, alors tu utilise java reflect exemple en bas pour y arriver
		*tri ta liste avec ton algo et ta fini :)
		*PD: tes toujour libre de prendre cette solution ou un autre. Bonne chance! et amuse toi =)
		*
		*d
///////////Exemple Java reflect avec comparator////////////////////////////////////////////////////////////////////	
		Carre carre=new Carre(1,0,0,20,20);
		Forme carre2=new Rectangle(1,0,0,40,20);
		Method methodGetAire=carre.getClass().getMethod("getAire");
		System.out.println(methodGetAire.invoke(carre));
		Method getComparateur=carre.getClass().getMethod("comparaisonAire");
		
		Comparator<Forme> compa=(Comparator<Forme>) getComparateur.invoke(carre);
		System.out.println(compa.compare(carre, carre2));
		System.out.println(carre2.getType());*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
	}
	public ApplicationFormes()
	{
		ControleurFrontal controleur=new ControleurFrontal();
		GestionaireFormes gestionaire=new GestionaireFormes();
		CommBase comm = new CommBase(gestionaire);
		FenetrePrincipale fenetre = new FenetrePrincipale(comm,controleur,gestionaire);	
		controleur.setCommBaseRef(comm);
		controleur.setFenetrePrincipaleRef(fenetre);
		controleur.setGestionaireRef(gestionaire);
		controleur.faireAction(Labo2Const.Actions.AFFICHER_DIALOGUE_CONNEXION);
		
	}
}
